import { EntityTypes, GroupId } from '@/utils/orgConstants';
import Vue from 'vue';
import CtpI18n from "@/utils/ctpI18n";

/**
 * 判断类型是不是需要判断包含子部门
 * @param entity
 * @returns {boolean}
 */
export const isSubDeptType = (entity) => {
	return entity.type === EntityTypes.Department || entity.type === EntityTypes.BusinessDepartment || entity.type === EntityTypes.Node;
};

/**
 * 判断是否为TreeNode节点
 * @param entity
 * @returns {*}
 */
const isTreeNode = (entity) => {
	return entity.parentId && entity.children && entity.data;
};

const getEntityKey = (nodeData, argments = { notIncludeSubDept: false }) => {
	let entity = nodeData;
	if (isTreeNode(entity)) {
		entity = nodeData.data;
	}
	let entityUUID = entity.type + '|' + entity.id;
	if (entity.type === EntityTypes.Member) {
		// 人员的Id，需要添加部门+岗位
		// 部门Id
		if (entity.sourceDepts && entity.sourceDepts.length > 0) {
			entityUUID += '|' + entity.sourceDepts[0].id;
		} else {
			entityUUID += '|' + entity.deptId;
		}
		// 岗位Id
		if (entity.sourcePosts && entity.sourcePosts.length > 0) {
			entityUUID += '|' + entity.sourcePosts[0].id;
		} else {
			entityUUID += '|' + entity.postId;
		}
	} else if (isSubDeptType(entity)) {
		// 部门Id需要判断是否包含子部门
		if (argments.notIncludeSubDept) {
			entityUUID += '|1';
		}
	}
	return entityUUID;
};

export function deepEqual(x, y) {
	// 指向同一内存时
	if (x === y) {
		return true;
	}
	if (typeof x == 'object' && x !== null && typeof y == 'object' && y !== null) {
		const xKeys = Object.keys(x),
			yKeys = Object.keys(y);
		if (xKeys.length !== yKeys.length) {
			return false;
		}

		for (const prop in x) {
			if (x.hasOwnProperty(prop)) {
				if (y.hasOwnProperty(prop)) {
					if (!deepEqual(x[prop], y[prop])) {
						return false;
					}
				} else {
					return false;
				}
			}
		}
		return true;
	}
	return false;
}
/**
 * 获取树的所有子节点
 * @param tree  树
 * @return [] 树节点数组
 */
export const getTreeItems = tree => {
  if (!tree) return []
  const list = [tree]
  const result = [tree]
  while (list.length) {
    const item = list.shift()
    if (item.children && item.children.length) {
      result.push(...item.children)
      list.push(...item.children)
    }
  }
  return result
}
/**
 * 实体唯一Id映射
 * @param entity
 * @param argments {{notIncludeSubDept: boolean}} 其他参数
 */
export const getEntityUuid = (entity, argments = { notIncludeSubDept: false }) => {
	if (entity.$_entityUuid) {
		return entity.$_entityUuid;
	}
	entity.$_entityUuid = getEntityKey(entity, argments);
	if (isTreeNode(entity)) {
		entity.data.$_entityUuid = entity.$_entityUuid;
	}
	return entity.$_entityUuid;
};
/**
 * 获取左侧 $_selectKey Id
 * @param entity
 * @returns {string|*}
 */
export const getSelectKey = (entity) => {
	if (entity.$_selectKey) {
		return entity.$_selectKey;
	}
	entity.$_selectKey = getEntityKey(entity, {});
	if (isTreeNode(entity)) {
		entity.data.$_selectKey = entity.$_selectKey;
	}
	return entity.$_selectKey;
};

/**
 * 通过selecedKey 删除数据
 * @param list 列表
 * @param selectedKey 选择的数据key
 */
export const deleteBySelectedKey = (list, selectedKey) => {
	let index = list.findIndex(el => getSelectKey(el) === selectedKey);
	if (index !== -1) {
		Vue['delete'](list, index);
	}
};

const blue = '#0077FF';
const black = '#000';
const red = '#FF4D4F';

/**
 *  是否显示单位简称
 * @param item 实体
 * @param params 参数
 * @param accountId 当前登录单位Id
 * @returns {boolean}
 */
const showShortName = (item, params, accountId) => {
	if (params.showAccountShortname === 'yes' && item.accountId !== accountId) {
		return true;
	}
	if (params.showAccountShortname === 'no') {
		return false;
	}
	if (item.data) {
		// item为TreeNode树节点
		return item.data.accountId !== accountId;
	}
	return item.accountId !== accountId;
};

/**
 * 应用属性字段格式化
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const appLinkFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		const { fieldName, name } = item;
		let showName = name;
		if (fieldName) {
			showName = `${fieldName}${name}`;
		}
		return {
			name: showName,
			color: black
		};
	}
};
/**
 * 默认格式化处理
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const simpleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: item.name,
			color: black
		};
	}
};
/**
 * 默认格式化处理【蓝色字】
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const simpleBlueFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: item.name,
			color: blue
		};
	}
};
/**
 * 不同单位加上单位后缀蓝色字
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const diffAccountBlueFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let { $_entityUuid, $_excludeChildDepartment } = item;
		let { isConfirmExcludeSubDepartment } = params;
		let isNotInlcudeDeptChilren = isSubDeptType(item) && $_entityUuid && $_entityUuid.split('|').length === 3;
		// 兼容自定义选人处理
		if (isSubDeptType(item) && $_excludeChildDepartment && isConfirmExcludeSubDepartment) {
			isNotInlcudeDeptChilren = true;
		}
		let name = item.name;
		if (showShortName(item, params, accountId)) {
			name += '(' + (item.accountShortName || item.data.accountShortName) + ')';
		}

		if (isNotInlcudeDeptChilren) {
			name += '(不包含子部门)';
		}
		return {
			name: name,
			color: blue
		};
	}
};
/**
 * 不同单位加上单位后缀蓝色字
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const diffAccountRedFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: item.name,
			color: red
		};
	}
};
/**
 * 多维组织单位
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const businessAccountFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let entity = item;
		if (isTreeNode(item)) {
			entity = item.data;
		}
		return {
			name: `${entity.name}(${entity.accountShortName})`,
			color: blue
		};
	}
};
/**
 * 多维组织单位
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const businessRoleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let shortName = '';
		if (item.accountId && (GroupId === item.accountId || accountId !== item.accountId)) {
			shortName = '(' + item.accountShortName + ')';
		}
		console.log(item, accountId, params);
		return {
			name: `${item.businessAccountShortName}(${item.accountShortName})-${item.name}${shortName}`,
			color: black
		};
	}
};
/**
 * 部门岗位
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const departmentPostFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: `${item.deptName}-${item.name}`,
			color: blue
		};
	}
};
/**
 * 部门岗位
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const businessDeptFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let name = '';
		if (item.accountShortName) {
			name = `${item.businessAccountShortName}(${item.accountShortName})-${item.name}`;
		} else if (item.businessAccountShortName) {
			name = `${item.businessAccountShortName}-${item.name}`;
		} else {
			name = `${item.name}`;
		}
		if (item.$_entityUuid.split('|').length === 3) {
			name += '(不包含子部门)';
		}
		return {
			name,
			color: blue
		};
	}
};
/**
 * 多维组织部门角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const businessDeptRoleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: `${item.businessAccountShortName}(${item.accountShortName})-${item.deptName}-${item.name}`,
			color: black
		};
	}
};
/**
 * 多维组织部门角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const memberFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let resultObj = {
			name: `${item.name}`,
			color: black
		};
		if (showShortName(item, params, accountId)) {
			if (item.accountShortName) {
				return {
					name: `${item.name}(${item.accountShortName})`,
					color: black
				};
			}
		}
		return resultObj;
	}
};
/**
 * 角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const roleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		let shortName = '';
		if (item.accountId && (GroupId === item.accountId || accountId !== item.accountId)) {
			shortName = '(' + item.accountShortName + ')';
		}
		if (item.typeName === $i18n('selectPeople.joinAccountRole.title')
			|| item.typeName === $i18n('selectPeople.joinUnitRole.title')) {
			shortName = '';
		}
		return {
			name: `${item.name}${shortName}`,
			color: blue
		};
	}
};
/**
 * 单位角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const accountRoleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: `${item.accountName}-${item.name}`,
			color: blue
		};
	}
};
/**
 * 部门角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const deptRoleFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: `${item.deptName}-${item.name}`,
			color: blue
		};
	}
};
/**
 * 元数据
 * @type {{showName(*, *, *): {color: string}}}
 */
const orgMetadataTagFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string}}
	 */
	showName(item, accountId, params) {
		let resultObj = {
			color: 'black'
		};
		if (item.metaDataType === 'Unit') {
			resultObj.name = item.name;
			resultObj.color = black;
		} else if (item.id.indexOf('_') > -1) {
			// 部门下人员的主数据
			resultObj.name = `[${item.deptName}]${item.prefix}[${item.metadataTypeName} = ${item.name}](${item.accountShortName})`;
			resultObj.color = black;
		} else {
			resultObj.name = `${item.prefix}[${item.metadataTypeName} = ${item.name}](${item.accountShortName})`;
			resultObj.color = black;
		}
		return resultObj;
	}
};
/**
 * 相对角色
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const nodeFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		const {
			type,
			accountShortName,
			businessAccountShortName,
			nodeName,
			name,
			$_entityUuid
		} = item;
		let shortName = '';
		if ($_entityUuid.split('|').length === 3) {
			shortName = '(不包含子部门)';
		}
		if (accountShortName && businessAccountShortName && nodeName) {
			return {
				name: `${businessAccountShortName}(${accountShortName})-${nodeName}${name}${shortName}`,
				color: black
			};
		} else if (nodeName) {
			return {
				name: `${nodeName}${name}${shortName}`,
				color: black
			};
		} else {
			return {
				name: `${name}${shortName}`,
				color: black
			};
		}
	}
};
/**
 * 表单字段
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const formFieldFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		if (
			item.accountShortName &&
			item.businessAccountShortName &&
			item.fieldName
		) {
			return {
				name: `${item.businessAccountShortName}(${item.accountShortName})-${item.fieldName}${item.name}`,
				color: black
			};
		} else if (item.fieldName) {
			return {
				name: `${item.fieldName}${item.name}`,
				color: black
			};
		} else {
			return {
				name: `${item.name}`,
				color: black
			};
		}
	}
};
const VJoinAccountTagFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		return {
			name: `${item.name}`,
			color: black
		};
	}
};

/**
 * 自定义选人-组织变量
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const orgSystemVarFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		if (item.varName) {
			return {
				name: `${item.varName}${item.name}`,
				color: black
			};
		} else {
			return {
				name: `${item.name}`,
				color: black
			};
		}
	}
};
/**
 * 自定义选人-表单控件
 * @type {{showName(*, *, *): {color: string, name: string}}}
 */
const orgFormFieldFormat = {
	/**
	 * 右侧数据格式化
	 * @param item 数据项
	 * @param accountId 单位Id
	 * @param params 其他参数
	 * @returns {{color: string, name: string}}
	 */
	showName(item, accountId, params) {
		if (item.formFieldName) {
			return {
				name: `${item.formFieldName}${item.name}`,
				color: black
			};
		} else {
			return {
				name: `${item.name}`,
				color: black
			};
		}
	}
};

const DefaultFormat = simpleFormat;

/**
 * 选人实体类型和格式化对象关系映射
 */
const FormatMapping = {
	[EntityTypes.Doc]: appLinkFormat,
	[EntityTypes.Meeting]: appLinkFormat,
	[EntityTypes.MeetingSummary]: appLinkFormat,
	[EntityTypes.Bulletin]: appLinkFormat,
	[EntityTypes.News]: appLinkFormat,

	[EntityTypes.Department]: diffAccountBlueFormat,
	[EntityTypes.Post]: diffAccountBlueFormat,
	[EntityTypes.Level]: diffAccountBlueFormat,
	[EntityTypes.Account]: diffAccountRedFormat,
	[EntityTypes.DepartmentPost]: departmentPostFormat,
	[EntityTypes.Role]: roleFormat,
	[EntityTypes.AccountRole]: accountRoleFormat,
	[EntityTypes.DepartmentRole]: deptRoleFormat,
	[EntityTypes.Member]: memberFormat,

	[EntityTypes.OrgMetadataTag]: orgMetadataTagFormat,
	[EntityTypes.JoinAccountTag]: VJoinAccountTagFormat,

	[EntityTypes.BusinessAccount]: businessAccountFormat,
	[EntityTypes.BusinessRole]: businessRoleFormat,
	[EntityTypes.BusinessDepartment]: businessDeptFormat,
	[EntityTypes.BusinessDepartmentBusinessRole]: businessDeptRoleFormat,

	[EntityTypes.Admin]: simpleFormat,
	[EntityTypes.WfDynamicForm]: simpleFormat,
	[EntityTypes.WfSuperNode]: simpleFormat,
	[EntityTypes.Team]: simpleBlueFormat,
	[EntityTypes.Node]: nodeFormat,
	[EntityTypes.FormField]: formFieldFormat,
	[EntityTypes.OrgSystemVar]: orgSystemVarFormat,
	[EntityTypes.OrgFormField]: orgFormFieldFormat
};

export const entityFormat = (item, outAccountId, params) => {
	let format = FormatMapping[item.type];
	if (!format) {
		console.debug('没有获取到对应类似的格式化方式，使用默认格式化方式！', item);
		format = DefaultFormat;
	}
	return format.showName(item, outAccountId, params);
};


/**
 * 转义html函数，防止xss攻击
 * @param { String } str
 * @param { String } return
 */
export const escapeXml = (str) => {
	return str
		.replace(/'/g, '&#39;')
		.replace(/&/g, '&amp;')
		.replace(/</g, '&lt;')
		.replace(/>/g, '&gt;');
};
